import {
  config
} from 'config.js';

class Log {

  constructor() {

    this.USER_ACTION_KEY = 'ets';

    /**
     * 公共参数
     */
    this.cm = {
      "uid": "", // (String) 用户标识
      "vc": config.versionCode, // (String) versionCode，程序版本号
      "vn": config.versionName, // (String) versionName，程序版本名
      "l": "", // (String) language系统语言
      "os": "", // (String) 系统版本
      "md": "", // (String) model手机型号
      "ba": "", // (String) brand手机品牌
      "sv": "", // (String) sdkVersion
      "hw": "", // (String) height * width，屏幕宽高
      "t": new Date().getTime(), // (String) 客户端日志产生时的时间
      "nw": "" // (String) 网络模式
    }

    /**
     * 获取系统信息
     */
    wx.getSystemInfo({
      success: (result) => {
        // language系统语言
        this.cm.l = result.language;
        // 系统版本
        this.cm.os = result.system;
        // model手机型号
        this.cm.md = result.model;
        // brand手机品牌
        this.cm.ba = result.brand;
        // sdkVersion
        this.cm.sv = result.SDKVersion;
        // height * width，屏幕宽高
        this.cm.hw = `${result.screenHeight * result.pixelRatio} * ${result.screenWidth * result.pixelRatio}`;
      },
    });

  }

  /**
   * 初始化用户行为容器
   */
  initUserActionContainer() {
    let ets = wx.getStorageSync(this.USER_ACTION_KEY);
    if (!ets) {
      wx.setStorageSync(this.USER_ACTION_KEY, new Array());
    }
  }

  /**
   * 发送启动事件日志
   */
  start() {
    let that = this;

    // 获取网络接口响应比构造器慢,导致nw字段赋值失败,所以先调用网络接口
    wx.getNetworkType({
      success: (result) => {
        that.cm.nw = result.networkType;
        // 发送请求
        that.request({
          url: 'log/start',
          data: {
            'token': wx.getStorageSync('token'),
            'cm': that.cm,
          },
          method: 'POST'
        });
      },
    });
  }

  /**
   * 添加用户日志并自动提交到后台处理
   * @param {Object} et 用户日志 
   */
  addToEts(et) {
    let ets = wx.getStorageSync(this.USER_ACTION_KEY);
    if (ets.length >= config.etLimit) {
      this.sendEvents(ets);
      ets = new Array();
    }
    ets.unshift(et);
    wx.setStorageSync(this.USER_ACTION_KEY, ets);
  }

  sendEvents(ets) {

    let that = this;
    let now = new Date().getTime();

    wx.getNetworkType({
      success: (result) => {
        that.cm.nw = result.networkType;
        that.cm.et = ets;
        // 发送请求
        that.request({
          url: 'log/events',
          data: {
            'token': wx.getStorageSync('token'),
            'cm': `${now}|${JSON.stringify(that.cm)}`,
          },
          method: 'POST'
        });
      },
    });
  }

  /**
   * 记录历史
   * @param {Long} contentId 
   */
  logHistory(contentId) {
    // 发送请求
    this.request({
      url: 'log/history',
      data: {
        'token': wx.getStorageSync('token'),
        'contentId': contentId,
        'viewTime': new Date().getTime()
      },
      method: 'POST'
    });
  }

  /**
   * 内容详情页埋点
   * @param {Object} logData 
   */
  logDetail(logData) {
    let data = {
      // 页面入口来源：应用首页=1、详情页相关推荐=2
      "entry": !logData.entry ? "1" : logData.entry,
      // 开始加载=1，加载成功=2（pv），加载失败=3, 退出页面=4
      "action": !logData.action ? "1" : logData.action,
      // 内容ID（服务端下发的ID）
      "contentId": !logData.contentId ? 0 : logData.contentId,
      // 图片数量
      "imgCount": !logData.imgCount ? 0 : logData.imgCount,
      // 页面停留时长
      "stayTime": !logData.stayTime ? 0 : logData.stayTime,
      // 加载时长
      "loadingTime": !logData.loadingTime ? 0 : logData.loadingTime,
      // 加载失败码
      "errCode": !logData.errCode ? "" : logData.errCode,
      // 分类ID
      "categoryId": !logData.categoryId ? 0 : logData.categoryId,
      // 标签
      "tags": !logData.tags ? 0 : logData.tags
    }

    // 记录日志
    let ev = {
      "ett": new Date().getTime(), //客户端事件产生时间
      "en": "detail", //事件名称
      "kv": data
    }
    this.addToEts(ev);
  }

  /**
   * 收集评论信息
   * @param {Object} logData 
   */
  logComment(logData) {
    let data = {
      "contentId": !logData.contentId ? 0 : logData.contentId,
      "content": !logData.content ? "" : logData.content,
      // 分类ID
      "categoryId": !logData.categoryId ? 0 : logData.categoryId
    }

    // 记录日志
    let ev = {
      "ett": new Date().getTime(), //客户端事件产生时间
      "en": "comment", //事件名称
      "kv": data
    }
    this.addToEts(ev);
  }

  /**
   * 收集点赞信息
   * @param {Object} logData 
   */
  logPraise(logData) {
    let data = {
      "contentId": !logData.contentId ? 0 : logData.contentId,
      // 分类ID
      "categoryId": !logData.categoryId ? 0 : logData.categoryId
    }

    // 记录日志
    let ev = {
      "ett": new Date().getTime(), //客户端事件产生时间
      "en": "praise", //事件名称
      "kv": data
    }
    this.addToEts(ev);
  }

  /**
   * 收集收藏信息
   * @param {Object} logData 
   */
  logFavorites(logData) {
    let data = {
      "contentId": !logData.contentId ? 0 : logData.contentId,
      // 分类ID
      "categoryId": !logData.categoryId ? 0 : logData.categoryId
    }

    // 记录日志
    let ev = {
      "ett": new Date().getTime(), //客户端事件产生时间
      "en": "favorites", //事件名称
      "kv": data
    }
    this.addToEts(ev);
  }

  /**
   * 收集关注信息
   * @param {Object} logData 
   */
  logFollow(userId) {
    // 记录日志
    let ev = {
      "ett": new Date().getTime(), //客户端事件产生时间
      "en": "follow", //事件名称
      "kv": {
        "userId": userId,
      }
    }
    this.addToEts(ev);
  }

  /**
   * 发送请求
   * @param {Object} param 参数 
   */
  request({
    url,
    data = {},
    method = 'GET'
  }) {
    return new Promise((resolve, reject) => {
      wx.request({
        url: config.baseUrl + url,
        method: method,
        data: data,
        header: {
          'content-type': 'application/json'
        },
        success: (res) => {
          const code = res.statusCode.toString();
          if (code.startsWith('2')) {
            resolve(res.data);
          } else {
            let err = res.data;
            reject(err);
          }
        },
        fail: (err) => {
          reject(err.data);
        }
      });
    });
  }

}

export {
  Log
}